<?php
/**
 * Created by PhpStorm.
 * User: wwj
 * Date: 2020/6/15
 * Time: 16:50
 * Note: base_func.php
 */

namespace app\lib;

use app\lib\enum\enum_sys;
use app\lib\model\problem;
use Ext\captcha;
use Ext\conf;
use Ext\redis;

class base_func
{
    /**
     * 获取图形验证码
     *
     * @return array
     * @throws \Exception
     */
    public static function get_auth_code(): array
    {
        return captcha::new()->set_redis(redis::create(conf::get('redis'))->connect())->set_font('georgia.ttf')->set_size(400, 120)->set_length(4)->set_types('num', 'word', 'plus')->get();
    }

    /**
     * 验证图形验证码和输入内容
     *
     * @param string $hash
     * @param string $input_code
     *
     * @return bool
     * @throws \Exception
     */
    public static function chk_auth_code(string $hash, string $input_code): bool
    {
        return captcha::new()->set_redis(redis::create(conf::get('redis'))->connect())->check($hash, $input_code);
    }

    public static function get_rand_str($len = 6, $type = 'str')
    {
        if ($type == 'str') {
            $arr = array_merge(range(0, 9), range('a', 'z'), range('A', 'Z'));
        } else {
            $arr = array_merge(range(0, 9));
        }
        shuffle($arr);
        $sub_arr = array_slice($arr, 0, $len);
        return implode('', $sub_arr);
    }

    public static function time2string($second)
    {
        $hour   = floor($second / 3600);
        $second = $second % 3600;//除去整小时之后剩余的时间
        $minute = floor($second / 60);
        $second = $second % 60;//除去整分钟之后剩余的时间
        //返回字符串
        return $hour . '小时' . $minute . '分' . $second . '秒';
    }

    /**
     * 过滤敏感词汇
     *
     * @param string $word
     */
    public static function skip_sensitive_word(string $word)
    {
        $con = enum_sys::SENSITIVE_WORD;
        //匹配
        preg_match_all('/(' . $con . ')/i', $word, $arr);
        //过滤掉敏感词
        foreach ($arr[1] as $ll_word) {
            //
            $len     = mb_strlen($ll_word);
            $replace = '';
            for ($k = 1; $k <= $len; $k++) {
                $replace .= '*';
            }
            $word = str_replace($ll_word, $replace, $word);
        }
        return $word;
    }

    public static function skip_advert(string $word)
    {
        //去掉网址
        $isMatched = preg_match_all('/https?:\/\/[0-9a-zA-Z\/;\.\?%&-=_]*/i', $word, $matches);
        if ($isMatched) {
            foreach ($matches as $http_word) {
                $word = str_replace($http_word, '**', $word);
            }
        }
        //去掉加微信广告
        $search    = '/[a-zA-Z0-9]{5,}/i';
        $isMatched = preg_match_all($search, $word, $arr);
        if ($isMatched) {
            foreach ($arr as $wx_word) {
                $word = str_replace($wx_word, '**', $word);
            }
        }
        return $word;
    }

    /**
     * 聊天中屏蔽某些词
     *
     * @param string $word
     *
     * @return string|string[]
     */
    public static function chat_skip_word(string $word)
    {
        if (strpos(trim($word), 'http') === 0) {
            //图片直接不处理返回
            return $word;
        }
        $con = '投资|入金|出金|赚|返现|红包|扶持|卖|买|币|糖果|积分|兑换|置换|加|加微|加我微|\+V|加我V|\+我V|加微信|\+微信|我微信|\+Q|加Q|团队|推广';
        //匹配
        preg_match_all('/(' . $con . ')/i', $word, $arr);
        //过滤掉敏感词
        foreach ($arr[1] as $ll_word) {
            //
            $len     = mb_strlen($ll_word);
            $replace = '';
            for ($k = 1; $k <= $len; $k++) {
                $replace .= '*';
            }
            $word = str_replace($ll_word, $replace, $word);
        }
        return $word;
    }

    /**
     * 自动匹配回复
     *
     * @param $union_id
     * @param $reward_mode
     * @param $word
     *
     * @return string
     */
    public static function auto_msg($union_id, $reward_mode, $word): string
    {
        if ($union_id == 10000) {
            $type = 1;
        } elseif ($reward_mode == 1) {
            //积分
            $type = 3;
        } else {
            $type = 2;
        }

        return (string)problem::new()->where(['type', $type], ['title', $word])->read_val('con');
    }

    //app端自动匹配回复  废弃
    public static function auto_msg_1($word)
    {
        /*$keyword_arr = [
            '发布任务|发任务|发布悬赏|发单|发广告|挂单',
            '支付宝|实名信息|实名认证|身份证号',
            '风险账号|限制提现|提示风险',
            '恶意驳回|举报|申诉|投诉',
            '驳回|重新交单',
            '交单|提交任务|交任务',
            '新手|不会做任务',
            '高手任务|高手区',
            '任务报酬发放时间|任务赏金到账时间',
            '置顶暂停|暂停置顶',
            '任务手续费',
            '24小时内下架手续费',
            '置顶退款|置顶退钱',
            '保证金退回|保证金退款|剩余保证金',
            '你好|您好|在吗'
        ];
        $answer_arr  = [
            '您好，发布任务需下载专门的商家发单APP，可以在百度搜索“松鼠帮帮”，蓝色松鼠头像的就是，或复制此链接下载：https://share.foretellmaster.com/share-ssbb/download。',
            '如果您填错了支付宝账号，在首次提现失败后，可以重新填写个人实名信息。如不能修改支付宝信息，需要申请人工修改，请准备好如下材料，然后给在线客服留言： 1. 跟本人关联的正确的支付宝账号： 2. 支付宝帐号所属人姓名和身份证号： 3. 支付宝所属人手持身份证正反面清晰照片 2 张，需露脸核对。相关客服会跟进。',
            '该情况一般是您的帐号由于被举报或风控系统识别出了违规行为，被限制提现。请给客服留言，客服会核实是何种违规行为，如违规行为不属实，会为您解封。',
            '在提交被驳回两次后，点击我的-点击我接的单-点击未通过--点击进入任务-点击右上角举报（等待申诉客服处理）',
            '部分任务交单被驳回可以在8小时内再次提交。点击“我的--我接的单--未通过，可以看到重新交单按钮。 请勿乱提交任务，否则会有被举报封号的风险。',
            '任务页面顶部会显示“您有X个任务待提交”，点击即可找到您接的任务。按照雇主的任务要求上传截图和文字凭证，点击“交单”按钮即可。',
            '1. 选任务后点击进入任务详情 2.查看任务要求后点击“我要接单” 3.按照雇主要求完成任务并截图 4.上传截图并点击交单 5.雇主审核通过可以拿到任务赏金 6.输入支付宝帐号提现。',
            '完成新手任务5单并审核通过即可解锁做高手任务资格。',
            '雇主审核通过后立即发放。',
            '暂停任务后置顶服务也会暂停，在任务重新上架后置顶服务重新开始计时。',
            '任务成交后才会扣除手续费，任务下架后将退回剩余名额的任务赏金及手续费。',
            '平台规定上架时长不足24小时，并且0成交的任务下架时收取1元费用。',
            '置顶服务是购买立即生效的，生效后无法退款。',
            '任务下架后未报名部分的悬赏金会立即返还到您的余额，已报名部分的悬赏金（有正在做单、待审核、被驳回、申诉中等）需等名额释后返还至您的余额。 备注：正在做单名额等超过交单时效未做返还;被驳回名额如果超过8小时未提交返还;申诉中的名额等处理结束后返还。',
            '您好，请您详细描述您的问题',
        ];
        $con         = '';
        foreach ($keyword_arr as $k => $keyword) {
            preg_match_all('/(' . $keyword . ')/i', $word, $arr);
            if ($arr[0]) {
                $con = $answer_arr[$k];
                break;
            }
        }
        return $con;*/
    }

    //积分渠道端自动匹配回复  废弃
    public static function auto_msg_2($word)
    {
        $keyword_arr = [
            '发布任务|发任务|发布悬赏|发单|发广告|挂单',
            '恶意驳回|举报|申诉|投诉',
            '驳回|重新交单',
            '交单|提交任务|交任务',
            '新手|不会做任务',
            '高手任务|高手区',
            '你好|您好|在吗'
        ];
        $answer_arr  = [
            '您好，目前只支持做任务，不支持发任务。',
            '在提交被驳回两次后，点击页面左上角头像-点击未通过-点击举报（等待申诉客服处理）',
            '部分任务交单被驳回可以在8小时内再次提交。点击点击页面左上角头像--未通过，可以看到重新交单按钮。 请勿乱提交任务，否则会有被举报封号的风险。',
            '任务页面顶部会显示“您有X个任务待提交”，点击即可找到您接的任务。按照雇主的任务要求上传截图和文字凭证，点击“交单”按钮即可。',
            '1. 选任务后点击进入任务详情 2.查看任务要求后点击“领取任务” 3.按照雇主要求完成任务并截图 4.上传截图并点击交单 5.雇主审核通过即可拿到报酬',
            '完成新手任务5单并审核通过即可解锁做高手任务资格。',
            '您好，请您详细描述您的问题',
        ];
        $con         = '';
        foreach ($keyword_arr as $k => $keyword) {
            preg_match_all('/(' . $keyword . ')/i', $word, $arr);
            if ($arr[0]) {
                $con = $answer_arr[$k];
                break;
            }
        }
        return $con;
    }

    //现金渠道端自动匹配回复 废弃
    public static function auto_msg_3($word)
    {
        $keyword_arr = [
            '发布任务|发任务|发布悬赏|发单|发广告|挂单',
            '支付宝|实名信息|实名认证|身份证号',
            '风险账号|限制提现|提示风险',
            '恶意驳回|举报|申诉|投诉',
            '驳回|重新交单',
            '交单|提交任务|交任务',
            '新手|不会做任务',
            '高手任务|高手区',
            '你好|您好|在吗'
        ];
        $answer_arr  = [
            '你好，发布任务需下载专门的商家发单APP，可以在百度搜索“松鼠帮帮”，蓝色松鼠头像的就是，或复制此链接下载：https://share.foretellmaster.com/share-ssbb/download。',
            '如果您填错了支付宝账号，在首次提现失败后，可以重新填写个人实名信息。如不能修改支付宝信息，需要申请人工修改，请准备好如下材料，然后给在线客服留言： 1. 跟本人关联的正确的支付宝账号： 2. 支付宝帐号所属人姓名和身份证号： 3. 支付宝所属人手持身份证正反面清晰照片 2 张，需露脸核对。相关客服会跟进。',
            '该情况一般是您的帐号由于被举报或风控系统识别出了违规行为，被限制提现。请给客服留言，客服会核实是何种违规行为，如违规行为不属实，会为您解封。',
            '在提交被驳回两次后，点击页面左上角头像-点击未通过-点击举报（等待申诉客服处理）',
            '部分任务交单被驳回可以在8小时内再次提交。点击点击页面左上角头像--未通过，可以看到重新交单按钮。 请勿乱提交任务，否则会有被举报封号的风险。',
            '任务页面顶部会显示“您有X个任务待提交”，点击即可找到您接的任务。按照雇主的任务要求上传截图和文字凭证，点击“交单”按钮即可。',
            '1. 选任务后点击进入任务详情 2.查看任务要求后点击“领取任务” 3.按照雇主要求完成任务并截图 4.上传截图并点击交单 5.雇主审核通过你即可拿到赏金 6.输入支付宝帐号提现。',
            '完成新手任务5单并审核通过即可解锁做高手任务资格。',
            '您好，请您详细描述您的问题',
        ];
        $con         = '';
        foreach ($keyword_arr as $k => $keyword) {
            preg_match_all('/(' . $keyword . ')/i', $word, $arr);
            if ($arr[0]) {
                $con = $answer_arr[$k];
                break;
            }
        }
        return $con;
    }

    //人性化显示时间
    public static function formatTime($sTime, $formt = 'Y-m-d')
    {

        if (!$sTime) {
            return '';
        }

        //sTime=源时间，cTime=当前时间，dTime=时间差
        $cTime = time();
        $dTime = $cTime - $sTime;
        $dDay  = intval(date('z', $cTime)) - intval(date('z', $sTime));
        $dYear = intval(date('Y', $cTime)) - intval(date('Y', $sTime));

        //n秒前，n分钟前，n小时前，日期
        if ($dTime < 60) {
            if ($dTime < 10) {
                return '刚刚';
            } else {
                return intval(floor($dTime / 10) * 10) . '秒前';
            }
        } elseif ($dTime < 3600) {
            return intval($dTime / 60) . '分钟前';
        } elseif ($dTime >= 3600 && $dDay == 0) {
            return intval($dTime / 3600) . '小时前';
        } elseif ($dDay > 0 && $dDay <= 7) {
            return intval($dDay) . '天前';
        } elseif ($dDay > 7 && $dDay <= 30) {
            return intval($dDay / 7) . '周前';
        } elseif ($dDay > 30) {
            return intval($dDay / 30) . '个月前';
        } elseif ($dYear == 0) {
            return date('m月d日', $sTime);
        } else {
            return date($formt, $sTime);
        }
    }

}